package com.tanjun.publicservice.web.biz.impl;

import com.tanjun.common.response.PageResponse;
import com.tanjun.common.utils.ConvertUntil;
import com.tanjun.pubilcservice.request.dict.DictPageRequest;
import com.tanjun.pubilcservice.request.dict.DictVo;
import com.tanjun.pubilcservice.response.dict.SysDictDataDto;
import com.tanjun.pubilcservice.response.dict.SysDictDetailDto;
import com.tanjun.publicservice.web.biz.SysDictBiz;
import com.tanjun.publicservice.web.orm.entity.SysDict;
import com.tanjun.publicservice.web.orm.entity.SysDictData;
import com.tanjun.publicservice.web.service.SysDictDataService;
import com.tanjun.publicservice.web.service.SysDictService;
import com.tanjun.web.service.LoginUserUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class SysDictBizImpl implements SysDictBiz {
    @Autowired
    private SysDictService dictService;
    @Autowired
    private SysDictDataService dictDataService;

    /**
     * 新增字典信息
     *
     * @param paramVo 字典信息
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addDict(DictVo paramVo) {
        SysDict sysDict= ConvertUntil.convert(paramVo,SysDict.class);
        sysDict.setCreator(LoginUserUtil.getAdminOperate());
        sysDict.setCreateTime(LocalDateTime.now());
        dictService.saveOrUpdateDic(sysDict);

        List<SysDictData> listData=ConvertUntil.convert(paramVo.getDictItems(),SysDictData.class);
        listData.forEach(d->{
            d.setCreateTime(LocalDateTime.now());
            d.setCreator(LoginUserUtil.getAdminOperate());
        });
        dictDataService.saveOrUpdateDictDaraList(paramVo.getDictCode(), listData);
    }

    /**
     * 修改字典信息
     *
     * @param paramVo 字典信息
     */
    @Override
    public void updateDict(DictVo paramVo) {
        SysDict sysDict= ConvertUntil.convert(paramVo,SysDict.class);
        sysDict.setUpdater(LoginUserUtil.getAdminOperate());
        sysDict.setUpdateTime(LocalDateTime.now());
        dictService.saveOrUpdateDic(sysDict);

        List<SysDictData> listData=ConvertUntil.convert(paramVo.getDictItems(),SysDictData.class);
        listData.forEach(d->{
            d.setUpdateTime(LocalDateTime.now());
            d.setUpdater(LoginUserUtil.getAdminOperate());
        });
        dictDataService.saveOrUpdateDictDaraList(paramVo.getDictCode(), listData);
    }

    /**
     * 删除字典信息
     *
     * @param id id
     */
    @Override
    public void delDict(Long id) {
        dictService.delDict(id);
    }

    /**
     * 获取字典基础信息+数据列表信息
     *
     * @param id 字典id
     * @return 字典详细信息
     */
    @Override
    public SysDictDetailDto getDetailById(Long id) {
        SysDict sysDict=dictService.getById(id);
        if(sysDict==null){
            return null;
        }
        SysDictDetailDto dto=ConvertUntil.convert(sysDict,SysDictDetailDto.class);

        List<SysDictData> list=dictDataService.listDictDataByCode(dto.getDictCode());
        dto.setDictItems(ConvertUntil.convert(list, SysDictDataDto.class));
        return dto;
    }

    /**
     * 分页查询字典基本信息
     *
     * @param paramVo 分页查询
     * @return 字典基本信息
     */
    @Override
    public PageResponse<SysDictDetailDto> listPageDict(DictPageRequest paramVo) {
//        Page<SysDict> page=dictService.page(new Page<>(paramVo.getPageNum(), paramVo.getPageSize()), Wrappers.lambdaQuery(SysDict.class)
//                .like(StrUtil.isNotEmpty(paramVo.getDictName()),SysDict::getName,paramVo.getDictName())
//                .orderByDesc(SysDict::getId)
//        );
//
//        PageResponse<SysDictDetailDto> pageData= ConvertUntil.convert(page, SysDictDetailDto.class);
//        if(CollectionUtil.isNotEmpty(pageData.getList())){
//            List<SysDictData> listDictData=dictDataService.list(Wrappers.lambdaQuery(SysDictData.class)
//                    .in(SysDictData::getDictCode,pageData.getList().stream().map(SysDictDetailDto::getDictCode).collect(Collectors.toSet()))
//            );
//            pageData.getList().forEach(d->{
//                List<SysDictDataDto> list=listDictData.stream().filter(t->t.getDictCode().equals(d.getDictCode()))
//                        .map(t->ConvertUntil.convert(t,SysDictDataDto.class))
//                        .sorted(Comparator.comparing(SysDictDataDto::getSort))
//                        .collect(Collectors.toList());
//                d.setDictItems(list);
//            });
//        }
//        return pageData;
        return null;
    }

    /**
     * 通过字典编码获取字典数据
     *
     * @param dictCode 字典编码
     * @return 字典数据
     */
    @Override
    public List<SysDictDataDto> getDictDataByDictCode(String dictCode) {
       List<SysDictData> list=dictDataService.listDictDataByCode(dictCode);
       return ConvertUntil.convert(list,SysDictDataDto.class);
    }
}
